2026-10-13T08:52:50.9567137Z ##[group]Run npm run test:deploy
2026-10-13T08:52:50.9567184Z [36;1mnpm run test:deploy[0m
2026-10-13T08:52:50.9567204Z shell: /usr/bin/bash -e {0}
2026-10-13T08:52:50.9567213Z env:
2026-10-13T08:52:50.9567223Z   CARGO_TERM_COLOR: never
2026-10-13T08:52:50.9567301Z   CLOUDFLARE_ACCOUNT_ID: 1e6f2cffa3f445920836e8ebe446bb58
2026-10-13T08:52:50.9567313Z   WRANGLER_SEND_METRICS: false
2026-10-13T08:52:50.9567322Z ##[endgroup]
2026-10-13T08:52:51.1318637Z 
2026-10-13T08:52:51.1318824Z > test:deploy
2026-10-13T08:52:51.1318865Z > node --test "scripts/deploy/*.test.mjs"
2026-10-13T08:52:51.1318883Z 
2026-10-13T08:52:51.3116938Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (5.314092ms)
2026-10-13T08:52:51.3121935Z ✔ the toolchain is read from rustc -V (0.3193ms)
2026-10-13T08:52:51.3126274Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.31903ms)
2026-10-13T08:52:51.3128151Z ✔ a unit's hash is read from its files and folders (0.40281ms)
2026-10-13T08:52:51.3129916Z ✔ only the units the build did not use are pruned (4.468462ms)
2026-10-13T08:52:52.8844867Z error: no matching package named `base64` found
2026-10-13T08:52:53.1996517Z location searched: crates.io index
2026-10-13T08:52:53.1996699Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-13T08:52:53.1996795Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-13T08:52:53.1996872Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-13T08:52:53.2737656Z ✔ the manifest matches every wrangler config in the repository (42.08194ms)
2026-10-13T08:52:53.2737792Z ✔ every wrangler.jsonc is found, and only checked-in ones (28.170923ms)
2026-10-13T08:52:53.2737883Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (39.194539ms)
2026-10-13T08:52:53.2744146Z ✔ stages follow bindings: nothing binds to a unit that ships after it (0.74968ms)
2026-10-13T08:52:53.2749732Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (1.122261ms)
2026-10-13T08:52:53.2761939Z ✔ Rust workers build with the shared script and the same wasm-opt level (1.1266ms)
2026-10-13T08:52:53.2763473Z ✔ shared crates and packages are read from workspace metadata (0.441951ms)
2026-10-13T08:52:53.2765327Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.64971ms)
2026-10-13T08:52:53.2766371Z ✔ services/runner/base.json records the base its folder builds (14.733007ms)
2026-10-13T08:52:53.2767601Z ✔ an image's hash ignores line endings, and its tags say what they are (151.218692ms)
2026-10-13T08:52:53.2786087Z ✔ only the lockfile entries the runner is built from name its image (0.551881ms)
2026-10-13T08:52:53.2786201Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (30.645284ms)
2026-10-13T08:52:53.2789040Z ✔ the registry is asked for an image's manifest, without Docker (1.587811ms)
2026-10-13T08:52:53.2838124Z ✔ a push counts only when it ends with a digest, and is tried again (1.035071ms)
2026-10-13T08:52:53.2838214Z ✔ a static Linux binary is told from a dynamic one (1.39517ms)
2026-10-13T08:52:53.2838301Z ﹣ path dependencies agree with Cargo's own resolved graph (1105.219817ms) # cargo metadata could not resolve offline
2026-10-13T08:52:53.2838360Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (82.64967ms)
2026-10-13T08:52:53.2838408Z ✔ a shared crate's change reaches every unit built from it, and no other (1.359461ms)
2026-10-13T08:52:53.2838454Z ✔ a shared package's change reaches what imports it (0.40138ms)
2026-10-13T08:52:53.2838497Z ✔ a crate's tests, benches and examples deploy nothing (1.04495ms)
2026-10-13T08:52:53.2838543Z ✔ a Rust file compiled only for tests is found from what declares it (1.422821ms)
2026-10-13T08:52:53.2838585Z ✔ this repository's test-only sources are read from git (277.705252ms)
2026-10-13T08:52:53.2841489Z ✔ decide: a change only to tests deploys nothing (2.105591ms)
2026-10-13T08:52:53.2882344Z ✔ own folders, declared inputs and root files (0.9493ms)
2026-10-13T08:52:53.2889012Z ✔ a Cargo.lock change reaches only crates that use what changed (0.83314ms)
2026-10-13T08:52:53.2889140Z ✔ a package-lock change reaches through workspace links (0.865861ms)
2026-10-13T08:52:53.2889219Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.53182ms)
2026-10-13T08:52:53.2889288Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.28554ms)
2026-10-13T08:52:53.2889354Z ✔ decide: Cargo.lock counts only where it reaches (0.917721ms)
2026-10-13T08:52:53.2896752Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.44181ms)
2026-10-13T08:52:53.2896852Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (1.665061ms)
2026-10-13T08:52:53.2896921Z ✔ units are picked by short name, folder or Worker name (0.62971ms)
2026-10-13T08:52:53.2896982Z ✔ a CI job installs only what its units need (1.293131ms)
2026-10-13T08:52:53.2897041Z ✔ a deploy is annotated with its commit, and read back (0.30483ms)
2026-10-13T08:52:53.2897107Z ✔ the live commit: the live version's, looking through secret changes (0.46473ms)
2026-10-13T08:52:53.2899984Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.49319ms)
2026-10-13T08:52:53.2900066Z ✔ the API's answers: the live commit as Wrangler's would give it (1.307741ms)
2026-10-13T08:52:53.7728758Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (504.381561ms)
2026-10-13T08:52:53.7734396Z ✔ the API is used only with the token Wrangler would be given (0.74248ms)
2026-10-13T08:52:53.7738222Z ✔ pending migrations: the folder's files less the names in d1_migrations (2.681532ms)
2026-10-13T08:52:53.8490940Z ✔ the pool runs everything, no more than its limit at once (17.580968ms)
2026-10-13T08:52:53.8491101Z ✔ self-hosting builds every Rust service the manifest says it runs (1.302531ms)
2026-10-13T08:52:53.8491161Z ✔ the self-hosting architecture page names every unit (0.33521ms)
2026-10-13T08:52:53.8491223Z ✔ the architecture's services page names every unit, with the services it binds to (4.341422ms)
2026-10-13T08:52:53.8491279Z ✔ resolveStack works on a manifest with no workspace crates or packages (4.627282ms)
2026-10-13T08:52:53.8491360Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.47895ms)
2026-10-13T08:52:53.8526360Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (2.305992ms)
2026-10-13T08:52:53.8526509Z ✔ a failed wrangler command is reported by its error, not its trace (0.34825ms)
2026-10-13T08:52:53.8526596Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.63829ms)
2026-10-13T08:52:53.8526700Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.45488ms)
2026-10-13T08:52:53.8526769Z ✔ the deploy tool itself parses: a test that never imports it would not notice (41.76705ms)
2026-10-13T08:52:54.4072041Z ✔ the statements are all there (1.75599ms)
2026-10-13T08:52:54.4072221Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (50.285134ms)
2026-10-13T08:52:54.4072320Z ✔ revoking an unused invite gives it back; an expired one never counted (102.430789ms)
2026-10-13T08:52:54.4072401Z ✔ a used invite is spent: revoking it does nothing and it still counts (54.147636ms)
2026-10-13T08:52:54.4072472Z ✔ a pending invite for the same address is found; a revoked one is not (50.706144ms)
2026-10-13T08:52:54.4072545Z ✔ staff grants add to the twenty and can take some back (50.964674ms)
2026-10-13T08:52:54.4072617Z ✔ signing up from the link spends the invite once and records who invited whom (47.311353ms)
2026-10-13T08:52:54.4072690Z ✔ a body that broke off is worth another try, a lockfile out of step is not (2.450651ms)
2026-10-13T08:52:54.4072761Z ✔ an install that ends without saying why, or stalls, is tried again (0.25463ms)
2026-10-13T08:52:54.4072875Z ✔ a dropped connection is tried again until the install passes (1.739901ms)
2026-10-13T08:52:54.4073405Z ✔ a real error fails at once (0.3312ms)
2026-10-13T08:52:54.4073479Z ✔ it gives up after its tries, with npm's exit code (0.45476ms)
2026-10-13T08:52:54.4073508Z ✔ a stalled install is run again (0.29869ms)
2026-10-13T08:52:54.5742266Z ✔ webhooks: the hourly purge deletes old deliveries by time (3.188352ms)
2026-10-13T08:52:54.5769557Z ✔ billing: this month's users are read from an index, not the ledger (61.86637ms)
2026-10-13T08:52:54.5769689Z ✔ events: a repository's events of one type, newest first, page by page (4.066652ms)
2026-10-13T08:52:54.5769778Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (18.507699ms)
2026-10-13T08:52:54.5770045Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (2.953071ms)
2026-10-13T08:52:54.5770143Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (2.446941ms)
2026-10-13T08:52:54.5773228Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (2.360381ms)
2026-10-13T08:52:54.7138874Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (6.182823ms)
2026-10-13T08:52:54.7150198Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.77919ms)
2026-10-13T08:52:54.7152474Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (1.153471ms)
2026-10-13T08:52:54.7156527Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.43663ms)
2026-10-13T08:52:54.7223693Z ✔ image references and bearer challenges are read (0.83333ms)
2026-10-13T08:52:54.7223816Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (39.082669ms)
2026-10-13T08:52:54.7224074Z ✔ a base that is not where it should be, or not what base.json says, stops it (1.818331ms)
2026-10-13T08:52:54.7224180Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (3.323002ms)
2026-10-13T08:52:54.8043307Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-13T08:52:54.8464764Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-13T08:52:54.8516423Z ✔ fields read numbers, ranges, lists and steps (3.027892ms)
2026-10-13T08:52:54.8516564Z ✔ the services' crons match when hosted g1t's would fire (2.919442ms)
2026-10-13T08:52:54.8526552Z ✔ what is due is each matching cron of each service (0.83023ms)
2026-10-13T08:52:54.8550347Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (43.902601ms)
2026-10-13T08:52:54.9842715Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (41.34467ms)
2026-10-13T08:52:54.9866311Z ✔ an announcement that fails is a warning, never a failed deploy (1.075171ms)
2026-10-13T08:52:54.9912627Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (1.12808ms)
2026-10-13T08:52:54.9914935Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.637ms)
2026-10-13T08:52:55.0067552Z ℹ tests 92
2026-10-13T08:52:55.0067905Z ℹ suites 0
2026-10-13T08:52:55.0068116Z ℹ pass 91
2026-10-13T08:52:55.0068308Z ℹ fail 0
2026-10-13T08:52:55.0068470Z ℹ cancelled 0
2026-10-13T08:52:55.0068674Z ℹ skipped 1
2026-10-13T08:52:55.0068865Z ℹ todo 0
2026-10-13T08:52:55.0069023Z ℹ duration_ms 3811.306807
